#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * @brief 从输入字符串中提取指定分隔符分隔的字段
 *
 * 本函数通过指定的分隔符将输入字符串分割成多个字段，并提取指定索引位置的字段（索引从1开始）。
 * 注意：该函数会修改输入字符串的副本（使用strtok），但不修改原始输入字符串。
 *
 * @param inputStr   输入字符串（原始数据，不会被修改）
 * @param delimiter  字段分隔符（单字符）
 * @param fieldIdx   要提取的字段索引（从1开始计数）
 * @param outStr     输出缓冲区（用于存储提取的字段）
 *
 * @return 执行状态
 *   @retval  0  成功提取字段（或字段不存在）
 *   @retval -1  内存分配失败（strdup错误）
 *
 * @note 重要限制：
 *  1. 字段索引从1开始（fieldIdx=1表示第一个字段）
 *  2. 若字段不存在：
 *        - 函数返回0（表示"成功"）
 *        - 但outStr内容保持不变（可能包含随机值）
 *  3. 输出缓冲区必须足够大（无长度检查，有溢出风险）
 *  4. 仅支持单字符分隔符
 *
 * @example 示例：
 *   char input[] = "John,Doe,30";
 *   char output[32];
 *   getfield(input, ',', 2, output); // 提取"Doe"
 */
int getfield(const char *inputStr, char delimiter, int fieldIdx, char *outStr)
{
	int count = 0;
	char *tmpStr = strdup(inputStr);
	if ( tmpStr == NULL ) { perror("strdup"); return -1; }

	char *token = strtok(tmpStr, &delimiter);
	while ( token != NULL )
	{
		if ( count == fieldIdx -1 )
		{
			strncpy(outStr, token, strlen(token) + 1);
			outStr[strlen(token)] = '\0';
			break;
		}
		count++;
		token = strtok(NULL, &delimiter);
	}
	free(tmpStr);
	return 0;
}

int main()
{
	char strBuff[256];
	char strValue[20];
	memset(strBuff, 0x00, sizeof(strBuff));
	memset(strValue, 0x00, sizeof(strValue));
	strcpy(strBuff, "589782395|123|ABCF|00001|");

	printf("strBuff=[%s]\n", strBuff);
	getfield(strBuff, '|', 3, strValue);
	printf("strValue=[%s]\n", strValue);

	return 0;
}
